﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class AnimalVirtual
{
public:
	virtual void speak()
	{
		cout << "动物在说话！" << endl;
	}

	//1.普通析构，是不会调用子类的析构函数，所以可能会导致释放不干净；此时，需要利用虚析构来解决这个问题；
	//~AnimalVirtual()
	/*virtual ~AnimalVirtual()
	{
		cout << "AnimalVirtual的析构调用！" << endl;
	}*/

	//2.纯虚析构，写法如下；纯虚析构，需要声明，还需要实现，类内声明，类外实现；
	virtual ~AnimalVirtual() = 0;
	//4.如果函数中出现了，纯虚析构函数，那么这个类也算抽象类；抽象类，不可以实例化对象；

};
AnimalVirtual::~AnimalVirtual()
{
	//3.纯虚析构函数的实现；
	cout << "AnimalVirtual的纯虚析构调用！" << endl;
}
class CatVirtual :public AnimalVirtual
{
public:
	CatVirtual(const char* name)
	{
		this->m_Name = new char[strlen(name) + 1];
		strcpy(this->m_Name, name);
	}
	virtual void speak()
	{
		cout << "小猫在说话！" << endl;
	}
	~CatVirtual()
	{
		cout << "Cat的析构调用！" << endl;
		if (this->m_Name != NULL)
		{
			delete[] this->m_Name;
			this->m_Name = NULL;
		}
	}

	char* m_Name;
};
void testVirtualFunc()
{
	AnimalVirtual* animal = new CatVirtual("TOM");
	animal->speak();//小猫在说话！

	delete animal;//AnimalVirtual的析构调用！ -->
	//Cat的析构调用！
	//AnimalVirtual的析构调用！ 
									//-->
	//Cat的析构调用！
	//AnimalVirtual的纯虚析构调用！

	//5.如果出现纯虚析构，类也算抽象类，不能实例化对象；
	//AnimalVirtual av;
	//AnimalVirtual* av = new AnimalVirtual;
}

//main295：虚析构和纯虚析构函数
int main295()
{
	testVirtualFunc();

	system("pause");
	return EXIT_SUCCESS;
}